#include "MessageShowArea.h"
#include <QLabel>
#include <QPainter>
#include <QPainterPath>
#include <QPushButton>
#include <QScrollBar>
#include <QTimer>
#include <QVBoxLayout>
#include "Custom/CircleButton.h"
#include "Debug.h"
#include "MainWidget.h"
#include "Model/Data.h"
#include "Model/DataCenter.h"
#include "SelfInfoDialog.h"
#include "UserInfoDialog.h"
#include <QFileDialog>
#include <QMessageBox>
#include "SoundRecorder.h"
#include <QMenu>
using namespace model;

////////////////////////////////////////////
/// 消息展示区域
////////////////////////////////////////////
MessageShowArea::MessageShowArea()
{
    /* 1. 设置基础属性 */
    this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    this->setWidgetResizable(true);
    container = new QWidget();
    this->setWidget(container);
    /* 2. 设置QSS*/
    this->setStyleSheet(SCROLL_STYLE);
    /* 3. 给Widget添加布局 */
    layout = new QVBoxLayout();
    layout->setSpacing(0);
    layout->setContentsMargins(10, 0, 0, 0);
    container->setLayout(layout);
    /* 链接信号槽, 当内容大小变化导致滚动条范围变化时自动滚动到底部 */
    connect(this->verticalScrollBar(), &QScrollBar::rangeChanged,
            this, &MessageShowArea::scroll_to_bottom);
}

/// @brief: 尾插
void MessageShowArea::add_message(const model::Message& message, bool is_left)
{
    MessageItem* message_item = MessageItem::make_message_item(message, is_left);
    layout->addWidget(message_item);
}

/// @brief: 头插
void MessageShowArea::insert_message(const model::Message& message, bool is_left)
{
    MessageItem* message_item = MessageItem::make_message_item(message, is_left);
    layout->insertWidget(0, message_item);
}

/// @brief: 全部清除
void MessageShowArea::clear_message()
{
    for (int i = layout->count() - 1; i >= 0; --i) {
        QLayoutItem* item = layout->takeAt(i);
        if (item != nullptr && item->widget()) {
            delete item->widget();
        }
        delete item;
    }
}

/// @brief 将滚动条滚动到最下面
void MessageShowArea::scroll_to_bottom()
{
    /* 使用单次定时器确保在布局更新后执行 */
    if (!auto_scroll_enabled)
        return;

    QScrollBar* v_scroll = this->verticalScrollBar();
    QTimer::singleShot(0, this, [this]() {
        QScrollBar* v_scroll = this->verticalScrollBar();
        v_scroll->setValue(v_scroll->maximum());
    });
}

/// @brief 当用户手动滚动时，暂时禁用自动滚动
void MessageShowArea::wheelEvent(QWheelEvent* event)
{
    // 用户滚动时暂时禁用自动滚动
    auto_scroll_enabled = false;
    QTimer::singleShot(2000, this, [this]() {  // 2秒后重新启用
        auto_scroll_enabled = true;
    });
    QScrollArea::wheelEvent(event);
}

////////////////////////////////////////////
/// 用户发的每一条消息，包含自己发的和别人发的
/// 包含用户的用户名和发送时间
////////////////////////////////////////////
MessageItem::MessageItem(bool is_left)
    : is_left(is_left)
{
}

/// @brief: 创建消息的工厂方法, 可以创建文本消息, 文字消息, 语音消息
MessageItem* MessageItem::make_message_item(const model::Message& message, bool is_left)
{
    /* 1. 添加头像 */
    CircleButton* avatar = new CircleButton();
    avatar->setIconSize(QSize(40, 40));
    avatar->setFixedSize(QSize(40, 40));
    avatar->setIcon(message.sender.avatar);
    avatar->setStyleSheet(
        "QPushButton {"
        "border: none;"
        "}");
    /* 2. 发送者和发送时间 */
    QLabel* name_and_time = new QLabel();
    name_and_time->setText(message.sender.nick_name + " | " + message.time);
    name_and_time->setStyleSheet(
        "QLabel {"
        "font-size: 12px;"
        "color:#BFBFBF;"
        "}");
    /* 3. 创建消息体 */
    QWidget* content_widget = nullptr;
    switch (message.message_type) {
    case model::TEXT_TYPE:
        content_widget = make_text_message_item(message.content, is_left);
        break;
    case model::IMAGE_TYPE:
        content_widget = make_image_message_item(message.file_id, message.content, is_left);
        break;
    case model::FILE_TYPE:
        content_widget = make_file_message_item(message.file_id, message.content, message.file_name, is_left);
        break;
    case model::SPEECH_TYPE:
        content_widget = make_speech_message_item(message.file_id, message.content, is_left);  
        break;
    case model::UNKNOW:
        LOG() << "Unknow Type";
        break;
    default:
        LOG() << "Default! message_type: " << message.message_type;
        break;
    }
    /* 4. 添加布局, 并连接信号槽, 当点击头像时, 弹出QDialog */
    MessageItem* message_item = new MessageItem(is_left);
    QGridLayout* g_layout     = new QGridLayout();
    g_layout->setHorizontalSpacing(10);
    g_layout->setContentsMargins(0, 10, 15, 0);
    message_item->setLayout(g_layout);
    if (is_left) {
        g_layout->addWidget(avatar, 0, 0, 2, 1, Qt::AlignTop);
        g_layout->addWidget(name_and_time, 0, 1);
        g_layout->addWidget(content_widget, 1, 1);
        connect(avatar, &QPushButton::clicked, message_item, [=]() {
            UserInfoDialog* info_widget = new UserInfoDialog(MainWidget::get_instance(), message.sender);
            info_widget->move(QCursor::pos());
            info_widget->exec();
        });
    } else {
        g_layout->addWidget(avatar, 0, 1, 2, 1, Qt::AlignTop);
        g_layout->addWidget(name_and_time, 0, 0, Qt::AlignRight);
        g_layout->addWidget(content_widget, 1, 0);
        connect(avatar, &QPushButton::clicked, message_item, []() {
            SelfInfoDialog* info_widget = new SelfInfoDialog(MainWidget::get_instance());
            info_widget->exec();
        });
    }
    return message_item;
}
/// @brief: 创建消息对象, 包含背景(白色或蓝色)和文本消息内容
QWidget* MessageItem::make_text_message_item(const QByteArray& content, bool is_left)
{
    return new MessageContentLabel(content, is_left);
}

/// @brief 创建图片消息对象
QWidget* MessageItem::make_image_message_item(const QString& file_id, const QByteArray& content, bool is_left)
{
    return new MessageImageLabel(file_id, content, is_left);
}

/// @brief 创建文件消息对象
QWidget* MessageItem::make_file_message_item(const QString& file_id, const QByteArray& content, const QString& file_name, bool is_left)
{
    return new MessageFileLabel(file_id, content, file_name, is_left);
}

/// @brief 创建语音消息对象
QWidget* MessageItem::make_speech_message_item(const QString& file_id, const QByteArray& content, bool is_left)
{
    return new MessageSpeechLabel(file_id, content, is_left);
}
/////////////////////////////////////////////////
/// 显示到界面上的消息的实现, 包含纯色背景和label
/////////////////////////////////////////////////
MessageContentLabel::MessageContentLabel(const QString& text, bool is_left)
    : is_left(is_left)
{
    this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    /* 初始化 label */
    label = new QLabel(this);
    label->setText(text);
    label->setWordWrap(true);                                   // 自动换行
    label->setTextInteractionFlags(Qt::TextSelectableByMouse);  // 使文本可选
    label->adjustSize();
    label->setStyleSheet(
        "QLabel {"
        "font-family: Microsoft YaHei;"
        "font-size: 14px;"
        "padding-left: 10px;"
        "padding-right: 10px;"
        "padding-top: 0px;"
        "padding-bottom: 0px;"
        "line-height: 1.2;"
        "background-color: transparent;"
        "}");  // 设置距离上下左右的边距, 1.2倍行距
}

/// @brief: 用于画后面的圆角矩形的背景
void MessageContentLabel::paintEvent(QPaintEvent* event)
{
    Q_UNUSED(event);
    /* 1. 得到父元素(MessageItem)的宽度, 该背景的宽度设置为父元素宽度的0.6倍 */
    QObject* object = this->parent();
    if (!object->isWidgetType()) {
        LOG() << "Not widget type!";
        return;
    }
    QWidget* parent = dynamic_cast<QWidget*>(object);
    if (parent == nullptr) {
        LOG() << "Dynamic cast error!";
        return;
    }
    int width = parent->width() * 0.6;  // 宽度设置为父类宽度的0.6倍
    /* 2. 得到背景的高度 */
    int              height = 0;
    QFontMetrics     metrics(label->font());
    int              total_width        = metrics.horizontalAdvance(label->text());            // 得到文字总的宽度
    static const int LEFT_RIGHT_SPACING = 10;                                                  // 给文本到背景左右留的间距是10px
    static const int UP_DOWN_SPACING    = 10;                                                  // 给文本到背景上下部分留的边距是10px
    int              row_cnt            = (total_width - LEFT_RIGHT_SPACING * 2) / width + 1;  // 一共有多少行
    if (row_cnt == 1) {
        width = total_width + LEFT_RIGHT_SPACING * 2 + 10;                                     // 只有1行, 调整宽度, 这里需要加上一点距离, 不然文字会换行, 不知道原因...
    }
    height = row_cnt * (label->font().pixelSize() * 1.2) + UP_DOWN_SPACING * 2;                // 1.2倍行距+上下的边距
    if (row_cnt > 1) {
        height += 15;                                                                          // 不然不好看
    }
    // width  -= 7;                                                                               // 这里调整一点宽度, 不然右边界太大, 不知道原因...                                                                             // 这里调整一点宽度, 不然右边界太大, 不知道原因...
    /* 3. 画圆角矩形并移动 label */
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);  // 抗锯齿
    QPainterPath path;
    if (is_left) {
        painter.setPen(QPen(QColor(255, 255, 255)));
        painter.setBrush(QColor(255, 255, 255));
        path.addRoundedRect(0, 0, width, height, 10, 10);  // 圆角矩形
        painter.drawPath(path);
        label->setGeometry(0, 0, width, height);           // 移动 label
    } else {
        painter.setPen(QPen(QColor(0, 153, 255)));
        painter.setBrush(QColor(0, 153, 255));
        int left_x = this->width() - width;
        path.addRoundedRect(left_x, 0, width, height, 10, 10);  // 圆角矩形
        painter.drawPath(path);
        label->setGeometry(left_x, 0, width, height);           // 移动 label
    }
    this->setFixedHeight(height + 3);                           // 瞪眼法设置这个控件的高度
}

MessageImageLabel::MessageImageLabel(const QString& file_id, const QByteArray& data, bool is_left)
    : file_id(file_id), data(data), is_left(is_left)
{
    image_button = new QPushButton(this);
    image_button->setStyleSheet(
        "QPushButton {"
        "border: none;"
        "background-color: transparent;"
        "}");
    this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    if (data.isEmpty()) {
        DataCenter* data_center = DataCenter::get_instance();
        // 从网络中获取图片内容
        connect(data_center, &DataCenter::get_single_file_done, this, &MessageImageLabel::update_content, Qt::UniqueConnection);
        data_center->get_single_file_async(file_id);
    } else {
        // 加载图片内容到 cache 中
        update_content(file_id, data);
    }
}

/// @brief 用于绘制图片, 根据图片不同大小进行缩放, 最大不能超过界面的60%
void MessageImageLabel::paintEvent(QPaintEvent* event)
{
    /* 得到父元素(MessageItem)的宽度, 该背景的宽度设置为父元素宽度的0.6倍 */
    QObject* object = this->parent();
    if (!object->isWidgetType()) {
        LOG() << "Not widget type!";
        return;
    }
    QWidget* parent = dynamic_cast<QWidget*>(object);
    if (parent == nullptr) {
        LOG() << "Dynamic cast error!";
        return;
    }
    int parent_width = parent->width();
    /* 如果图片尚未加载，显示加载中提示 */
    if (!imageLoaded) {
        QPainter painter(this);
        painter.drawText(rect(), Qt::AlignCenter, "加载中...");
        return;
    }
    /* 使用缓存的图片 */
    if (cachedPixmap.isNull()) {
        LOG() << "缓存图片为空!";
        return;
    }
    /* 计算图片缩放比例 */
    // 限制图片最大宽度为父控件宽度的0.6倍
    int max_width = parent_width * 0.6;
    int width     = qMin(cachedPixmap.width(), max_width);
    int height    = ((double)cachedPixmap.height() / (double)cachedPixmap.width()) * (double)width;
    // LOG() << "图片原始大小: " << image.width() << "x" << image.height() << ", 显示大小: " << width << "x" << height;
    image_button->setIcon(QIcon(cachedPixmap));
    image_button->setIconSize(QSize(width, height));
    /* 设置父元素高度 */
    parent->setFixedHeight(height + 30);
    /* 设置图片位置, 距离左边界or右边界10px */
    if (is_left) {
        image_button->setGeometry(10, 0, width, height);
    } else {
        image_button->setGeometry(parent->width() - width - 60, 0, width, height);
    }
}

/// @brief 根据 file_id 和 file_content 更新图片内容
void MessageImageLabel::update_content(const QString& file_id, const QByteArray& file_content)
{
    if (this->file_id != file_id) {
        return;
    }
    this->data = file_content;
    // 预先解码图片，loadFromData()很耗时，放在这里可以避免在paintEvent中卡顿
    QImage image;
    if (data.isEmpty()) {
        const QByteArray default_image_data = read_file(":/image/image.png");
        image.loadFromData(default_image_data);
    } else {
        image.loadFromData(data);
    }
    if (!image.isNull()) {
        // 缓存解码后的图片
        cachedPixmap = QPixmap::fromImage(image);
        imageLoaded  = true;  // 标记图片已加载
    } else {
        LOG() << "图片数据有问题, 无法加载!";
        imageLoaded = false;
    }
    this->update();  // 触发重绘
}

////////////////////////////////////////////
/// 显示到界面上的文件消息的实现
////////////////////////////////////////////
MessageFileLabel::MessageFileLabel(const QString& file_id, const QByteArray& content, const QString& file_name, bool is_left)
    : file_id(file_id), data(content), file_name(file_name), is_left(is_left)
{
    this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    /* 初始化 label */
    label = new QLabel(this);
    label->setText(file_name);
    label->setWordWrap(true);                                   // 自动换行
    label->adjustSize();
    label->setStyleSheet(
        "QLabel {"
        "font-family: Microsoft YaHei;"
        "font-size: 14px;"
        "padding-left: 10px;"
        "padding-right: 10px;"
        "padding-top: 0px;"
        "padding-bottom: 0px;"
        "line-height: 1.2;"
        "background-color: transparent;"
        "}");  // 设置距离上下左右的边距, 1.2倍行距
    if (content.isEmpty()) {
        DataCenter* data_center = DataCenter::get_instance();
        // 从网络中获取图片内容
        connect(data_center, &DataCenter::get_single_file_done, this, &MessageFileLabel::update_content,Qt::UniqueConnection);
        data_center->get_single_file_async(file_id);
    }
}

void MessageFileLabel::paintEvent(QPaintEvent* event)
{
    Q_UNUSED(event);
    /* 1. 得到父元素(MessageItem)的宽度, 该背景的宽度设置为父元素宽度的0.6倍 */
    QObject* object = this->parent();
    if (!object->isWidgetType()) {
        LOG() << "Not widget type!";
        return;
    }
    QWidget* parent = dynamic_cast<QWidget*>(object);
    if (parent == nullptr) {
        LOG() << "Dynamic cast error!";
        return;
    }
    int width = parent->width() * 0.6;  // 宽度设置为父类宽度的0.6倍
    /* 2. 得到背景的高度 */
    int              height = 0;
    QFontMetrics     metrics(label->font());
    int              total_width        = metrics.horizontalAdvance(label->text());            // 得到文字总的宽度
    static const int LEFT_RIGHT_SPACING = 10;                                                  // 给文本到背景左右留的间距是10px
    static const int UP_DOWN_SPACING    = 10;                                                  // 给文本到背景上下部分留的边距是10px
    int              row_cnt            = (total_width - LEFT_RIGHT_SPACING * 2) / width + 1;  // 一共有多少行
    if (row_cnt == 1) {
        width = total_width + LEFT_RIGHT_SPACING * 2 + 10;                                     // 只有1行, 调整宽度, 这里需要加上一点距离, 不然文字会换行, 不知道原因...
    }
    height = row_cnt * (label->font().pixelSize() * 1.2) + UP_DOWN_SPACING * 2;                // 1.2倍行距+上下的边距
    if (row_cnt > 1) {
        height += 15;                                                                          // 不然不好看
    }
    // width  -= 7;                                                                               // 这里调整一点宽度, 不然右边界太大, 不知道原因...                                                                             // 这里调整一点宽度, 不然右边界太大, 不知道原因...
    /* 3. 画圆角矩形并移动 label */
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);  // 抗锯齿
    QPainterPath path;
    if (is_left) {
        painter.setPen(QPen(QColor(255, 255, 255)));
        painter.setBrush(QColor(255, 255, 255));
        path.addRoundedRect(0, 0, width, height, 10, 10);  // 圆角矩形
        painter.drawPath(path);
        label->setGeometry(0, 0, width, height);           // 移动 label
    } else {
        painter.setPen(QPen(QColor(0, 153, 255)));
        painter.setBrush(QColor(0, 153, 255));
        int left_x = this->width() - width;
        path.addRoundedRect(left_x, 0, width, height, 10, 10);  // 圆角矩形
        painter.drawPath(path);
        label->setGeometry(left_x, 0, width, height);           // 移动 label
    }
    this->setFixedHeight(height + 3);                           // 瞪眼法设置这个控件的高度
}

/// @brief 点击该控件进行保存文件操作
void MessageFileLabel::mousePressEvent(QMouseEvent* event)
{
    if (event->button() == Qt::LeftButton) {
        QString file_path = QFileDialog::getSaveFileName(this, "保存文件", file_name);
        if (file_path.isEmpty()) {
            return;
        }
        QFile file(file_path);
        if (!file.open(QIODevice::WriteOnly)) {
            QMessageBox::warning(this, "错误", "无法保存文件: " + file.errorString());
            return;
        }
        if (data.isEmpty()) {
            QMessageBox::warning(this, "错误", "文件数据为空，无法保存！");
            return;
        }
        file.write(data);
        file.close();
        QMessageBox::information(this, "成功", "文件已保存到: " + file_path);
    }
}

/// @brief 根据 file_id 和 file_content 更新文件内容
void MessageFileLabel::update_content(const QString& file_id, const QByteArray& file_content)
{
    if (file_id != file_id) {
        return;
    }
    // 这里不需要向图片那样存一个 cache, 直接存 data 就行
    this->data = file_content;
    this->update();
}

////////////////////////////////////////////
/// 显示到界面上的语音消息的实现
////////////////////////////////////////////
MessageSpeechLabel::MessageSpeechLabel(const QString& file_id, const QByteArray& content, bool is_left)
    : file_id(file_id), data(content), is_left(is_left)
{
    this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    /* 初始化 label */
    label = new QLabel(this);
    label->setText("[||语音||");
    label->setWordWrap(true);  // 自动换行
    label->adjustSize();
    label->setStyleSheet(
        "QLabel {"
        "font-family: Microsoft YaHei;"
        "font-size: 14px;"
        "padding-left: 10px;"
        "padding-right: 10px;"
        "padding-top: 0px;"
        "padding-bottom: 0px;"
        "line-height: 1.2;"
        "background-color: transparent;"
        "}");  // 设置距离上下左右的边距, 1.2倍行距
    if (content.isEmpty()) {
        DataCenter* data_center = DataCenter::get_instance();
        // 从网络中获取图片内容
        connect(data_center, &DataCenter::get_single_file_done, this, &MessageSpeechLabel::update_content, Qt::UniqueConnection);
        data_center->get_single_file_async(file_id);
    }
}

void MessageSpeechLabel::paintEvent(QPaintEvent* event)
{
    Q_UNUSED(event);
    /* 1. 得到父元素(MessageItem)的宽度, 该背景的宽度设置为父元素宽度的0.6倍 */
    QObject* object = this->parent();
    if (!object->isWidgetType()) {
        LOG() << "Not widget type!";
        return;
    }
    QWidget* parent = dynamic_cast<QWidget*>(object);
    if (parent == nullptr) {
        LOG() << "Dynamic cast error!";
        return;
    }
    int width = parent->width() * 0.6;  // 宽度设置为父类宽度的0.6倍
    /* 2. 得到背景的高度 */
    int              height = 0;
    QFontMetrics     metrics(label->font());
    int              total_width        = metrics.horizontalAdvance(label->text());            // 得到文字总的宽度
    static const int LEFT_RIGHT_SPACING = 10;                                                  // 给文本到背景左右留的间距是10px
    static const int UP_DOWN_SPACING    = 10;                                                  // 给文本到背景上下部分留的边距是10px
    int              row_cnt            = (total_width - LEFT_RIGHT_SPACING * 2) / width + 1;  // 一共有多少行
    if (row_cnt == 1) {
        width = total_width + LEFT_RIGHT_SPACING * 2 + 10;                                     // 只有1行, 调整宽度, 这里需要加上一点距离, 不然文字会换行, 不知道原因...
    }
    height = row_cnt * (label->font().pixelSize() * 1.2) + UP_DOWN_SPACING * 2;                // 1.2倍行距+上下的边距
    if (row_cnt > 1) {
        height += 15;                                                                          // 不然不好看
    }
    // width  -= 7;                                                                               // 这里调整一点宽度, 不然右边界太大, 不知道原因...                                                                             // 这里调整一点宽度, 不然右边界太大, 不知道原因...
    /* 3. 画圆角矩形并移动 label */
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);  // 抗锯齿
    QPainterPath path;
    if (is_left) {
        painter.setPen(QPen(QColor(255, 255, 255)));
        painter.setBrush(QColor(255, 255, 255));
        path.addRoundedRect(0, 0, width, height, 10, 10);  // 圆角矩形
        painter.drawPath(path);
        label->setGeometry(0, 0, width, height);           // 移动 label
    } else {
        painter.setPen(QPen(QColor(0, 153, 255)));
        painter.setBrush(QColor(0, 153, 255));
        int left_x = this->width() - width;
        path.addRoundedRect(left_x, 0, width, height, 10, 10);  // 圆角矩形
        painter.drawPath(path);
        label->setGeometry(left_x, 0, width, height);           // 移动 label
    }
    this->setFixedHeight(height + 3);                           // 瞪眼法设置这个控件的高度
}

/// @brief 点击控件播放语音
void MessageSpeechLabel::mousePressEvent(QMouseEvent* event)
{
    if (event->button() == Qt::LeftButton) {
        SoundRecorder* recorder = SoundRecorder::get_instance();
        // 播放语音
        if (data.isEmpty()) {
            QMessageBox::warning(this, "错误", "语音数据为空，无法播放！");
            return;
        } else if(!recorder->is_playing()) {
            // 没在播放, 可以播放
            connect(recorder, &SoundRecorder::sound_play_done, this, [this]() {
                label->setText("[||语音||]");
                this->update();
            });
            label->setText("[>>播放中>>]");
            recorder->start_play(data);
        } else {
            // 在播放, 停止播放
            label->setText("[||语音||]");
            recorder->stop_play();
        }
    }
    this->update();
}

/// @brief 右键点击弹出菜单
void MessageSpeechLabel::contextMenuEvent(QContextMenuEvent* event)
{
    QMenu* menu = new QMenu(this);
    // 设置菜单样式表
    menu->setStyleSheet(R"(
        QMenu {
            background-color: #ffffff;    /* 背景颜色 */
            border: 1px solid #d0d0d0;    /* 边框 */
            border-radius: 4px;           /* 圆角边框 */
            padding: 4px;                 /* 内边距 */
            font-family: "Microsoft YaHei"; /* 字体 */
            font-size: 12px;              /* 字体大小 */
            box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); /* 阴影效果 */
        }
        QMenu::item {
            padding: 6px 16px;            /* 文字与边缘的间距 */
            color: #333333;              /* 文字颜色 */
            border-radius: 3px;          /* 菜单项圆角 */
            margin: 2px;                 /* 菜单项外边距 */
        }
        QMenu::item:selected {
            background-color: #e6f3ff;   /* 悬停/选中时的背景色 */
            color: #0066cc;              /* 悬停/选中时的文字颜色 */
        }
        QMenu::item:disabled {
            color: #999999;              /* 禁用项文字颜色 */
        }
        QMenu::separator {
            height: 1px;                 /* 分隔线高度 */
            background-color: #e0e0e0;   /* 分隔线颜色 */
            margin: 4px 6px;             /* 分隔线外边距 */
        }
    )");
    QAction* trans_action = menu->addAction("转文字");
    connect(trans_action, &QAction::triggered, this, [this]() {
        if (data.isEmpty()) {
            QMessageBox::warning(this, "错误", "语音数据为空，无法转文字！");
            return;
        }
        speech_recognition();
    });
    menu->exec(event->globalPos());
    delete menu;
}

/// @brief 根据 file_id 和 speech_content 更新文件内容
void MessageSpeechLabel::update_content(const QString& file_id, const QByteArray& speech_content)
{
    if (file_id != file_id) {
        return;
    }
    this->data = speech_content;
    this->update();
}

/// @brief 进行语音识别
void MessageSpeechLabel::speech_recognition()
{
    DataCenter* data_center = DataCenter::get_instance();
    connect(data_center, &DataCenter::speech_recognition_done, this, [this]
    (bool ok, const QString& reason, const QString& text) {
        if (text.isEmpty() || !ok) {
            QMessageBox::warning(this, "错误", "语音识别失败！原因: " + reason);
            return;
        }
        label->setText(text);
        this->update();
    });
    data_center->speech_recognition_async(data);
}
